import threading
import time
import os

# 线程之间共享全局变量
val = 0


def dance():
    # 获取当前线程
    print('跳舞线程编号：', threading.current_thread())
    for i in range(3):
        print('跳舞线程')
        global val
        val += 1
        print('跳舞线程value值：', val)
        time.sleep(0.2)


def sing():
    # 获取当前线程（唱歌线程)
    print('唱歌线程编号：', threading.current_thread())
    for i in range(3):
        print('唱歌线程')
        global val
        val += 1
        print('唱歌线程value值：', val)
        time.sleep(0.2)
        # 强制杀死唱歌线程，使其只执行一次
        # os.kill(sing_id, 9)


def show_info(name, age):
    print(name, age)



# 提示:.对应linux和mac主线程执行的代码不会线程拷贝，但是对应window系统来说主线程执行的代码也会进行拷贝执行
# 对于window来说创建子线程的代码如果线程拷贝执行相当于递归无限制进行创建子线程，会报错
# 如何解决windows递归创建子线程﹐通过判断是否是主模块来解决
if __name__ == '__main__':
    # group线程组目前只能写None,省略不写就是None
    # target是线程要执行的任务
    # name如果不指定线程名字就会自动为Threed-1...
    dance_threed = threading.Thread(target=dance)
    sing_threed = threading.Thread(target=sing)
    # 带有参数线程（可以元组传参数也可以字典传参）
    # 以元组方式传参要保证顺序一致 以字典方式传参要保证名称一致
    show_threed = threading.Thread(target=show_info, args=('xiaohong',), kwargs={'age': '11'})

    # # 设置子线程为守护线程
    dance_threed.daemon = True
    sing_threed.daemon = True
    show_threed.daemon = True

    dance_threed.start()
    # 线程等待，让跳舞线程先执行完后，再执行唱歌线程，保证数据不会有问题
    # dance_threed.join()
    sing_threed.start()
    show_threed.start()
    # 主线程会等所有子线程都结束了再结束
    # 设置主线程执行0.2s后退出
    # 设置子线程为守护线程，主线程退出子线程销毁，子线程依赖主线程
    time.sleep(0.2)
    print('over')

# 线程之间执行是无序的，顺序由cpu调度来决定
